/* 公共方法模块 */

let secondsDefault = 60; // 倒计时默认时间
let seconds = null; // 倒计时时间
// let isCountDown = false; // 是否正在倒计时
let countDowntimer; // 倒计时计时器
let session_id =
    '01j8h0pMydQXo1Oevsk7Uty9zYIxsibzBAvqRXNMqQo4zq3kCo6lZNEHa-Cw5AsmufGDrLOw2cedgcw8eZaxrdqaExLAz3vd-b_dWoXQ4-d2k8uWPstk9OYKzQwLUr8tBZ5r6K7yGdiwrzEOhiU7stGdFUhlOaUKltAep2jt7BDiCb6xO2lZmK5tDapwFM4jOd'; // 阿里云智能验证
let validate_code = '69411637310608007'; // 阿里云智能验证

/**
 * 检查登录状态，并获取用户信息
 * 
 * @param {Boolean} isRequest 是否通过请求接口获取用户信息 [true:接口请求 / false:本地缓存]
 */
async function checkLogin(isRequest = false) {
    let token = uni.getStorageSync('token');
    let user = null;
    if (isRequest) {
        // 接口获取
        let res = await this.get('/v1/homeapp/profile', null, null, false);
        if (res.status === 1) {
            // 缓存用户信息
            uni.setStorageSync('user', res.data);
            user = res.data;
        }
    } else {
        // 缓存获取
        user = uni.getStorageSync('user');
    }

    // 处理未登录
    if (!token || !user) {
        uni.removeStorageSync('token');
        uni.removeStorageSync('user');
        return;
    }

    // 返回用户信息
    return user;
}

/**
 * 发送短信验证码
 * 
 * @param {String}   phone    手机号
 * @param {Function} callback 回调方法
 */
async function sendSms(phone, type, callback) {
    // 正在倒计时
    // if (isCountDown) return;

    // 开始倒计时
    // isCountDown = true;

    // 验证参数
    let rule = {
        'phone|手机': 'require|mobile',
    };
    let validate = this.validate({
        phone
    }, rule);
    if (validate) {
        // isCountDown = false;
        this.show(validate.msg);
        return;
    }

    // 接口获取
    let res = await this.post('/apa/getSmsCode', {
        phone,
        type
    });
    if (res.status === 0) {
        // isCountDown = false;
        this.show(res.message);
        return;
    }

    this.show(res.message);
    seconds = secondsDefault;
    countDowntimer = setInterval(function() {
        seconds--;
        if (seconds === 0) {
            clearInterval(countDowntimer);
            // isCountDown = false;
            callback([false, 0, res.message, 1]);
            return;
        }
        callback([true, seconds, 1]);
    }, 1000)
}

/**
 * OSS上传
 * 
 * @param {String} type      // 业务类型
 * @param {String} spu_uid   // 商品UID
 * @param {String} store_uid // 店铺UID
 * @param {Number} number    // 文件数量
 * @param {Object} callback  // 回调方法
 */
async function uploadOss(type, spu_uid, store_uid, number, callback) {
    // 选择图片
    uni.chooseImage({
        count: number,
        success: async image => {
            // 获取上传授权凭据
            let url = '/apa/getOssStsToken';
            let res = await this.post('/apa/getOssStsTokenMini', null, null, false);
            if (res.status === 0) {
                this.show('上传失败');
                return;
            }
            res = res.data;
            // 最大个数限制（10个）
            number = number > image.tempFiles.length ? image.tempFiles.length : number;
            number = number > 10 ? 10 : number;

            // let currentText = '';
            let successNumber = 0;
            uni.showLoading({
                title: '正在上传'
            });

            for (let i = 0; i < number; i++) {

                // 多文件名称处理
                let filename = res.filename;
                if (number > 1) {
                    filename = res.filename + '_' + i;
                    // currentText = '第' + (parseInt(i) + 1) + '文件';
                }

                // 判断大小
                let fileSize = image.tempFiles[i].size / 1024;

                // 判断后缀
                let suffix;
                // #ifdef H5
                let name = image.tempFiles[i].name;
                suffix = (name.substr(name.lastIndexOf('.'))).toLowerCase();
                let isSuffix = false;
                for (let j in res.allow_ext) {
                    if ('.' + res.allow_ext[j] == suffix) {
                        isSuffix = true;
                    }
                }

                // #endif

                // #ifndef H5
                suffix = '.jpg';
                // #endif
                // 执行上传
                let uploadFileRes = await uni.uploadFile({
                    url: 'https://' + res.bucket + '.' + res.region + '.aliyuncs.com',
                    filePath: image.tempFiles[i].path, // 要上传的临时文件路径
                    name: 'file',
                    formData: {
                        key: res.path + filename + suffix, // 文件名
                        policy: res.policy, // 超时时间
                        OSSAccessKeyId: res.oss_access_key_id, // OSS访问密钥ID
                        success_action_status: '200',
                        signature: res.sign // 签名
                    }
                });

                if (!uploadFileRes || !uploadFileRes[1] || uploadFileRes[1].statusCode !== 200) {
                    // this.show(currentText + '上传失败');
                    continue;
                }

                // 上传成功回调
                callback({
                    index: i, // 图片下标
                    cdn_url: res.cdn_url, // 域名地址
                    path: res.path, // 保存路径
                    filename: filename + suffix, // 文件名称
                    suffix, // 文件后缀
                    url: res.cdn_url + res.path + filename + suffix, // 完整地址
                    uri: res.path + filename + suffix,
                });
                successNumber++;
            }

            setTimeout(() => {
                uni.hideLoading();
                if (successNumber === 0) {
                    this.show('上传失败');
                } else if (number === 1) {
                    this.show('上传成功');
                } else {
                    this.show('成功上传' + successNumber + '文件');
                }
            }, 150);
        }
    });
}

/**
 * 收藏商品或关注档口
 * 
 * @param {String|Array} uids UID或UID数组
 * @param {Number}       type 类型 [1:添加 / 0:取消]
 * @param {Number}       role 对象 [1:商品 / 2:档口]
 * 
 * @return {Boolean}
 */
async function favourite(uids, type = 1, role = 1) {
    // 字符串参数转数组
    uids = this.isType(uids, 7) ? [uids] : uids;

    // 发送请求
    let res, msg;
    if (type == 1) {
        // 批量添加
        if (role == 1) { // 商品
            res = await this.post('/v1/homeapp/buyer/favourite/spus', {
                targetUids: uids
            });
        } else { // 档口
            res = await this.post('/v1/homeapp/buyer/favourite/store', {
                targetUid: uids[0]
            });
        }
        msg = [(role == 1 ? '收藏成功' : '关注成功'), 'success'];
    } else {
        // 批量取消（商品、档口通用）
        res = await this.del('/v1/homeapp/buyer/favourite/batch_delete', {
            targetUids: uids
        });
        msg = [(role == 1 ? '取消收藏成功' : '取消关注成功'), 'none'];
    }

    // 返回结果
    if (res.status === 0) {
        this.show(res.msg);
        return false;
    }
    this.show(...msg);
    return true;
}

/**
 * 添加或删除铺货记录
 * 
 * @param {String|Array} uids UID或UID数 （添加:使用商品UID、删除:使用铺货单UID）
 * @param {Number}       type 类型 [1:添加 / 0:删除]
 * 
 * @return {Boolean}
 */
async function distribution(uids, type = 1) {
    // 字符串参数转数组
    uids = this.isType(uids, 7) ? [uids] : uids;

    // 发送请求
    let res, msg;
    if (type == 1) {
        // 添加
        res = await this.post('/v1/homeapp/buyer/distribution', {
            spu_uid: uids[0]
        });
        msg = ['加入成功', 'success'];
    } else {
        // 删除（商品、档口通用）
        res = await this.del('/v1/homeapp/buyer/distribution?uids=' + uids.join('-'));
        msg = ['删除成功', 'none'];
    }

    uni.setStorageSync('billUpdate', 1)

    // 返回结果
    if (res.status === 0) {
        this.show(res.msg);
        return false;
    }
    this.show(...msg);
    return true;
}

/**
 * 文本复制
 *
 * @param {String} value 文本内容
 */
function textCopy(value) {
    uni.setClipboardData({
        data: value, //要被复制的内容
        success: () => {
            this.show('复制成功');
        }
    });
}

/**
 * 手机号码格式化  13800000000  =》  138****0000
 *
 * @param {String} phone 手机号码
 */
function phoneReplace(phone) {
    phone = phone + ''
    phone = phone.replace(/(\d{3})\d{4}(\d{4})/, "$1****$2");
    return phone;
}

/**
 * 支付
 * 
 * @param {String} type    业务类型 ['order':订单 / 'recharge':充值 / 'join':保证金 / 'return':售后寄回 ]
 * @param {Object} payment 支付方式 ['balance':余额支付 / 'alipay':支付宝支付 / 'wechat':微信支付 ]
 * @param {String} amount  金额
 * @param {String} uids    支付UID列表
 */
async function pay(amount, callback) {
    let res; // 请求结果
    // let param = { total_amount: amount }; // 请求参数
    let data1 = amount;
    let data = {} // 支付参数
    // 非H5
    // #ifndef H5
    uni.getProvider({
        service: 'oauth',
        success: providerRes => {
            uni.login({
                provider: providerRes.provider,
                success: async loginRes => {
                    // 微信支付
                    data1.code = loginRes.code; // 微信登录code

                    console.log(data1);
                    // 小程序
                    // #ifdef MP-WEIXIN
                    data1.payment = 'wechat_mini';
                    data.provider = 'wxpay';
                    // #endif

                    // 请求充值参数
                    res = await this.post('/apa/user/createBuyVipOrder', data1)
                    if (res.status === 0) {
                        console.log(res);
                        return;
                    }
                    // 合并数据
                    data = Object.assign(data, res.data.mhtpInfo);

                    // 发起支付
                    uni.requestPayment({
                        ...data,
                        success: res => {
                            console.log(res);
                            callback(1)
                        },
                        fail: err => {
                            callback(0)
                            console.log(err);
                        }
                    })
                    console.log('data', data);
                }
            });
        }
    });
    // #endif
}

function formatMsgTime(timespan) {
    var dateTime = new Date(timespan) // 将传进来的字符串或者毫秒转为标准时间
    var year = dateTime.getFullYear()
    var month = dateTime.getMonth() + 1
    var day = dateTime.getDate()
    var hour = dateTime.getHours()
    var minute = dateTime.getMinutes() // var second = dateTime.getSeconds() 
    var millisecond = dateTime.getTime() // 将当前编辑的时间转换为毫秒
    var now = new Date() // 获取本机当前的时间
    var nowNew = now.getTime() // 将本机的时间转换为毫秒
    var milliseconds = 0
    var timeSpanStr
    milliseconds = nowNew - millisecond
    if (milliseconds <= 1000 * 60 * 1) {
        // 小于一分钟展示为刚刚
        timeSpanStr = '刚刚'
    } else if (1000 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60) {
        // 大于一分钟小于一小时展示为分钟
        timeSpanStr = Math.round((milliseconds / (1000 * 60))) + '分钟前'
    } else if (1000 * 60 * 60 * 1 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24) {
        // 大于一小时小于一天展示为小时
        timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60)) + '小时前'
    } else if (1000 * 60 * 60 * 24 < milliseconds && milliseconds <= 1000 * 60 * 60 * 24 * 15) {
        // 大于一天小于十五天展示位天
        timeSpanStr = Math.round(milliseconds / (1000 * 60 * 60 * 24)) + '天前'
    } else if (milliseconds > 1000 * 60 * 60 * 24 * 15 && year === now.getFullYear()) {
        timeSpanStr = month + '-' + day + ' ' + hour + ':' + minute
    } else {
        timeSpanStr = year + '-' + month + '-' + day + ' ' + hour + ':' + minute
    }
    return timeSpanStr
}

/**
 * 
 * @param {*} name 地点名称
 * @param {*} latitude 纬度
 * @param {*} longitude 经度
 */
function openMap(name, latitude, longitude) {
    let plugin = requirePlugin('routePlan');
    let key = 'NNGBZ-QVF6Z-7VLXA-ZQVVA-QUMQ2-F5FZQ'; //使用在腾讯位置服务申请的key
    let referer = '自助台球'; //调用插件的app的名称
    let endPoint = JSON.stringify({ //终点
        'name': name,
        'latitude': Number(latitude),
        'longitude': Number(longitude)
    });
    wx.navigateTo({
        url: 'plugin://routePlan/index?key=' + key + '&referer=' + referer + '&endPoint=' + endPoint +
            '&navigation=' + 1
    });
}

module.exports = {
    checkLogin,
    sendSms,
    uploadOss,
    favourite,
    distribution,
    textCopy,
    phoneReplace,
    pay,
    formatMsgTime,
    openMap
}